package com.xzm.service.impl;

/**
 * @author 3052
 * @create 2020-07-26 21:00
 */
import com.xzm.dao.IUserDao;
import com.xzm.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

/*
       业务层实现类
       曾经的XML配置
       <bean id="userService" class="com.xzm.service.impl.UserServiceImpl"
            scope="" init-method="" destroy-method="">
              <property name="" value="" /ref=""></property>
       </bean>

       用于创建对象的
            他的作用和在xml配置中编写一个bean标签实现的功能是一样的
            @Component
                作用：用于把当前对象存入spring容器中
                属性：
                    value，用于指定bean的id值，当我们不写的时候，他的默认值是当前类名，且首字母小写
            @Controller 一般用在表现层
            @Service 一般用于业务层
            @Repository 一般用于持久层   //注意为一般，一定条件可以相互使用
            ********以上三个注解作用和属性和Component是一样的，
            他们三个的作用是spring框架为我们提供明确的三层使用的注解，使我们的三层对象更清晰
            ************
       用于注入数据的
            他的作用和xml配置中编写一个property标签的作用是一样的
            @Autowired:
                作用：自动按照类型注入，只要容器中有唯一一个bean对象类型和要注入的变量类型匹配，就可以注入成功
                    如果ioc容器中没有任何bean类型和要注入的类型匹配，则报错。
                    当ioc容器中有多个类型匹配时，
                出现位置：可以是变量上，也可以是方法上
                细节：在使用注释注入时，set方法就不是必须的
           @Qualifier
                作用：按照类的基础上注入，再按照名称进行注入。它在给类成员注入式不能单独使用，但是再给方法注入时，可以单独使用。
                属性：
                    value：用于指定注入bean的id
          @Resource
                作用：直接按照bean的id注入，它可以独立使用，不用依托于autowired
                属性：
                    name：用于指定bean的id
          以上三个注入都只能注入其他bean类型的数据，而基本类型和string类型无法使用上述注解实现
          另外，集合类型的注入只能通过xml来实现。

          @value
                作用;用于注入基本数据类型和string类型
                属性：
                    value：用于指定数据的值。它可以使用Spring中的Spel（也就是spring中的el表达式）
                        spel表达式的写法： ${表达式}

       用于改变作用范围的
            他的作用和bean标签中使用scope标签是一样的
            @Scope
                    作用：用于指定bean的作用范围
                    属性：
                        value：指定范围的取值，常用取值 singleton prototype
       和生命周期相关的 (了解)
            他的作用和bean标签中init-method和destroy-method标签是一样的
            @PreDestroy
                    作用：用于指定销毁方法
            @PostConstruct
                    作用：用于指定初始化方法
 */
@Component(value="userServiceImpl")//@Component("userServiceImpl")
//@Scope(value ="prototype")
public class UserServiceImpl implements IUserService {

    //@Autowired
    @Resource(name="userDaoImpl2")
    private IUserDao userDao;

    @PostConstruct
    private void init(){
        System.out.println("初始化成功……");
    }

    @PreDestroy
    private void destroy(){
        System.out.println("销毁成功……");
    }
    public void saveUser() {
        userDao.saveuser();
    }
}
